#ifdef ZZZ_SSE
#include "SHCoeff4f_SSE.hpp"

namespace zzz{

  SHCoeff4f_SSE::SHCoeff4f_SSE(void)
  {
  }

  SHCoeff4f_SSE::SHCoeff4f_SSE(float *data)
  {
    *this=data;
  }

  SHCoeff4f_SSE::SHCoeff4f_SSE(const SHCoeff4f_SSE &coef)
  {
    *this=coef;
  }

  SHCoeff4f_SSE::~SHCoeff4f_SSE(void)
  {
  }

  void SHCoeff4f_SSE::TripleProduct4Appr(SHCoeff4f_SSE *ret,const SHCoeff4f_SSE &coef)
  {
    if (ret==this)
    {
      SHCoeff4f_SSE tmp(*this);
      tmp.TripleProduct4Appr(this,coef);
      return;
    }
    ret->Zero();
    float *c=ret->v;
    const float *a=v,*b=coef.v;
    c[0]=0.282095f*Dot(coef);
    c[6]+=0.090109f*a[5]*b[5];
    c[8]+=-0.058340f*(a[3]*b[13]+a[13]*b[3]);
    c[7]+=0.059470f*(a[12]*b[13]+a[13]*b[12]);
    c[5]+=0.059471f*(a[11]*b[12]+a[12]*b[11]);
    c[3]+=-0.058340f*(a[8]*b[13]+a[13]*b[8]);
    c[13]+=-0.058340f*(a[3]*b[8]+a[8]*b[3]);
    c[11]+=0.058369f*(a[1]*b[8]+a[8]*b[1]);
    c[1]+=0.058369f*(a[8]*b[11]+a[11]*b[8]);
    c[4]+=-0.058452f*(a[3]*b[11]+a[11]*b[3]);
    c[12]+=0.059470f*(a[7]*b[13]+a[13]*b[7]);
    c[6]+=0.090120f*a[7]*b[7];
    c[8]+=0.058369f*(a[1]*b[11]+a[11]*b[1]);
    c[7]+=0.090120f*(a[6]*b[7]+a[7]*b[6]);
    c[5]+=0.090109f*(a[5]*b[6]+a[6]*b[5]);
    c[3]+=-0.058452f*(a[4]*b[11]+a[11]*b[4]);
    c[13]+=-0.058452f*(a[1]*b[4]+a[4]*b[1]);
    c[11]+=-0.058452f*(a[3]*b[4]+a[4]*b[3]);
    c[1]+=-0.058452f*(a[4]*b[13]+a[13]*b[4]);
    c[4]+=-0.058452f*(a[1]*b[13]+a[13]*b[1]);
    c[10]+=0.115150f*(a[5]*b[13]+a[13]*b[5]);
    c[6]+=0.126182f*a[11]*b[11];
    c[8]+=-0.094025f*(a[9]*b[11]+a[11]*b[9]);
    c[7]+=0.115150f*(a[10]*b[11]+a[11]*b[10]);
    c[5]+=0.115150f*(a[10]*b[13]+a[13]*b[10]);
    c[3]+=-0.126223f*(a[3]*b[6]+a[6]*b[3]);
    c[13]+=0.059470f*(a[7]*b[12]+a[12]*b[7]);
    c[11]+=0.059471f*(a[5]*b[12]+a[12]*b[5]);
    c[1]+=-0.126236f*(a[1]*b[6]+a[6]*b[1]);
    c[4]+=-0.094033f*(a[9]*b[13]+a[13]*b[9]);
    c[14]+=0.115169f*(a[7]*b[13]+a[13]*b[7]);
    c[6]+=-0.126223f*a[3]*b[3];
    c[8]+=-0.094056f*(a[13]*b[15]+a[15]*b[13]);
    c[7]+=0.115169f*(a[13]*b[14]+a[14]*b[13]);
    c[5]+=-0.115175f*(a[11]*b[14]+a[14]*b[11]);
    c[3]+=-0.142912f*(a[7]*b[12]+a[12]*b[7]);
    c[13]+=-0.094033f*(a[4]*b[9]+a[9]*b[4]);
    c[11]+=-0.094025f*(a[8]*b[9]+a[9]*b[8]);
    c[1]+=-0.143046f*(a[5]*b[12]+a[12]*b[5]);
    c[4]+=0.094033f*(a[11]*b[15]+a[15]*b[11]);
    c[2]+=0.184449f*(a[8]*b[14]+a[14]*b[8]);
    c[6]+=-0.126236f*a[1]*b[1];
    c[8]+=-0.145674f*a[11]*b[11];
    c[7]+=-0.142912f*(a[3]*b[12]+a[12]*b[3]);
    c[5]+=-0.143046f*(a[1]*b[12]+a[12]*b[1]);
    c[3]+=0.184557f*(a[5]*b[10]+a[10]*b[5]);
    c[13]+=-0.094056f*(a[8]*b[15]+a[15]*b[8]);
    c[11]+=0.094033f*(a[4]*b[15]+a[15]*b[4]);
    c[1]+=0.184557f*(a[7]*b[10]+a[10]*b[7]);
    c[4]+=0.145561f*(a[11]*b[13]+a[13]*b[11]);
    c[12]+=0.059471f*(a[5]*b[11]+a[11]*b[5]);
    c[6]+=0.126282f*a[13]*b[13];
    c[8]+=0.145785f*a[13]*b[13];
    c[7]+=0.148543f*(a[14]*b[15]+a[15]*b[14]);
    c[5]+=0.148600f*(a[9]*b[14]+a[14]*b[9]);
    c[9]+=-0.094025f*(a[8]*b[11]+a[11]*b[8]);
    c[15]+=0.094033f*(a[4]*b[11]+a[11]*b[4]);
    c[10]+=0.115150f*(a[7]*b[11]+a[11]*b[7]);
    c[11]+=0.115150f*(a[7]*b[10]+a[10]*b[7]);
    c[13]+=0.115150f*(a[5]*b[10]+a[10]*b[5]);
    c[14]+=-0.115175f*(a[5]*b[11]+a[11]*b[5]);
    c[6]+=0.168126f*a[12]*b[12];
    c[8]+=-0.156112f*a[5]*b[5];
    c[7]+=0.148683f*(a[9]*b[10]+a[10]*b[9]);
    c[5]+=-0.148673f*(a[10]*b[15]+a[15]*b[10]);
    c[4]+=0.155967f*(a[5]*b[7]+a[7]*b[5]);
    c[2]+=0.184558f*(a[4]*b[10]+a[10]*b[4]);
    c[1]+=-0.184781f*(a[5]*b[14]+a[14]*b[5]);
    c[3]+=0.184955f*(a[7]*b[14]+a[14]*b[7]);
    c[9]+=-0.094033f*(a[4]*b[13]+a[13]*b[4]);
    c[15]+=-0.094056f*(a[8]*b[13]+a[13]*b[8]);
    c[6]+=0.180199f*a[6]*b[6];
    c[8]+=0.156254f*a[7]*b[7];
    c[13]+=0.115169f*(a[7]*b[14]+a[14]*b[7]);
    c[11]+=-0.115175f*(a[5]*b[14]+a[14]*b[5]);
    c[12]+=-0.142912f*(a[3]*b[7]+a[7]*b[3]);
    c[14]+=0.148543f*(a[7]*b[15]+a[15]*b[7]);
    c[10]+=-0.148673f*(a[5]*b[15]+a[15]*b[5]);
    c[5]+=0.155967f*(a[4]*b[7]+a[7]*b[4]);
    c[7]+=0.155967f*(a[4]*b[5]+a[5]*b[4]);
    c[4]+=-0.180333f*(a[4]*b[6]+a[6]*b[4]);
    c[6]+=-0.180333f*a[4]*b[4];
    c[8]+=-0.180343f*(a[6]*b[8]+a[8]*b[6]);
    c[3]+=0.202190f*(a[6]*b[13]+a[13]*b[6]);
    c[1]+=0.202243f*(a[6]*b[11]+a[11]*b[6]);
    c[2]+=0.218414f*(a[3]*b[7]+a[7]*b[3]);
    c[11]+=0.126182f*(a[6]*b[11]+a[11]*b[6]);
    c[13]+=0.126282f*(a[6]*b[13]+a[13]*b[6]);
    c[12]+=-0.143046f*(a[1]*b[5]+a[5]*b[1]);
    c[15]+=0.148543f*(a[7]*b[14]+a[14]*b[7]);
    c[14]+=0.148600f*(a[5]*b[9]+a[9]*b[5]);
    c[6]+=-0.180343f*a[8]*b[8];
    c[8]+=0.184449f*(a[2]*b[14]+a[14]*b[2]);
    c[9]+=0.148600f*(a[5]*b[14]+a[14]*b[5]);
    c[10]+=0.148683f*(a[7]*b[9]+a[9]*b[7]);
    c[5]+=-0.156112f*(a[5]*b[8]+a[8]*b[5]);
    c[7]+=0.156254f*(a[7]*b[8]+a[8]*b[7]);
    c[4]+=0.184558f*(a[2]*b[10]+a[10]*b[2]);
    c[1]+=0.218374f*(a[3]*b[4]+a[4]*b[3]);
    c[3]+=0.218374f*(a[1]*b[4]+a[4]*b[1]);
    c[2]+=0.218461f*(a[1]*b[5]+a[5]*b[1]);
    c[6]+=0.202190f*(a[3]*b[13]+a[13]*b[3]);
    c[8]+=-0.187900f*(a[12]*b[14]+a[14]*b[12]);
    c[11]+=0.145561f*(a[4]*b[13]+a[13]*b[4]);
    c[13]+=0.145561f*(a[4]*b[11]+a[11]*b[4]);
    c[15]+=-0.148673f*(a[5]*b[10]+a[10]*b[5]);
    c[9]+=0.148683f*(a[7]*b[10]+a[10]*b[7]);
    c[12]+=0.168126f*(a[6]*b[12]+a[12]*b[6]);
    c[14]+=0.184449f*(a[2]*b[8]+a[8]*b[2]);
    c[5]+=0.184557f*(a[3]*b[10]+a[10]*b[3]);
    c[10]+=0.184557f*(a[3]*b[5]+a[5]*b[3]);
    c[6]+=0.202243f*(a[1]*b[11]+a[11]*b[1]);
    c[7]+=0.184558f*(a[1]*b[10]+a[10]*b[1]);
    c[4]+=-0.188019f*(a[10]*b[12]+a[12]*b[10]);
    c[3]+=0.218414f*(a[2]*b[7]+a[7]*b[2]);
    c[1]+=0.218461f*(a[2]*b[5]+a[5]*b[2]);
    c[8]+=-0.218732f*a[1]*b[1];
    c[2]+=0.233572f*(a[5]*b[11]+a[11]*b[5]);
    c[11]+=-0.145674f*(a[8]*b[11]+a[11]*b[8]);
    c[13]+=0.145785f*(a[8]*b[13]+a[13]*b[8]);
    c[10]+=0.184558f*(a[1]*b[7]+a[7]*b[1]);
    c[6]+=-0.210482f*a[9]*b[9];
    c[5]+=-0.184781f*(a[1]*b[14]+a[14]*b[1]);
    c[14]+=-0.184781f*(a[1]*b[5]+a[5]*b[1]);
    c[7]+=0.184955f*(a[3]*b[14]+a[14]*b[3]);
    c[12]+=-0.187900f*(a[8]*b[14]+a[14]*b[8]);
    c[9]+=-0.210482f*(a[6]*b[9]+a[9]*b[6]);
    c[15]+=-0.210522f*(a[6]*b[15]+a[15]*b[6]);
    c[4]+=0.218374f*(a[1]*b[3]+a[3]*b[1]);
    c[1]+=-0.218732f*(a[1]*b[8]+a[8]*b[1]);
    c[8]+=0.218821f*a[3]*b[3];
    c[3]+=0.218821f*(a[3]*b[8]+a[8]*b[3]);
    c[6]+=-0.210522f*a[15]*b[15];
    c[2]+=0.233583f*(a[7]*b[13]+a[13]*b[7]);
    c[10]+=0.184558f*(a[2]*b[4]+a[4]*b[2]);
    c[14]+=0.184955f*(a[3]*b[7]+a[7]*b[3]);
    c[12]+=-0.188019f*(a[4]*b[10]+a[10]*b[4]);
    c[13]+=0.202190f*(a[3]*b[6]+a[6]*b[3]);
    c[11]+=0.202243f*(a[1]*b[6]+a[6]*b[1]);
    c[7]+=0.218414f*(a[2]*b[3]+a[3]*b[2]);
    c[5]+=0.218461f*(a[1]*b[2]+a[2]*b[1]);
    c[15]+=0.226034f*(a[3]*b[8]+a[8]*b[3]);
    c[3]+=0.226034f*(a[8]*b[15]+a[15]*b[8]);
    c[8]+=0.226034f*(a[3]*b[15]+a[15]*b[3]);
    c[1]+=0.226108f*(a[8]*b[9]+a[9]*b[8]);
    c[9]+=0.226108f*(a[1]*b[8]+a[8]*b[1]);
    c[4]+=-0.226136f*(a[1]*b[15]+a[15]*b[1]);
    c[6]+=0.247669f*(a[2]*b[12]+a[12]*b[2]);
    c[2]+=0.247669f*(a[6]*b[12]+a[12]*b[6]);
    c[14]+=-0.187900f*(a[8]*b[12]+a[12]*b[8]);
    c[10]+=-0.188019f*(a[4]*b[12]+a[12]*b[4]);
    c[15]+=-0.226136f*(a[1]*b[4]+a[4]*b[1]);
    c[3]+=0.226185f*(a[4]*b[9]+a[9]*b[4]);
    c[8]+=0.226108f*(a[1]*b[9]+a[9]*b[1]);
    c[1]+=-0.226136f*(a[4]*b[15]+a[15]*b[4]);
    c[9]+=0.226185f*(a[3]*b[4]+a[4]*b[3]);
    c[4]+=0.226185f*(a[3]*b[9]+a[9]*b[3]);
    c[5]+=0.233572f*(a[2]*b[11]+a[11]*b[2]);
    c[11]+=0.233572f*(a[2]*b[5]+a[5]*b[2]);
    c[7]+=0.233583f*(a[2]*b[13]+a[13]*b[2]);
    c[13]+=0.233583f*(a[2]*b[7]+a[7]*b[2]);
    c[12]+=0.247669f*(a[2]*b[6]+a[6]*b[2]);
    c[2]+=0.252308f*(a[2]*b[6]+a[6]*b[2]);
    c[6]+=0.252308f*a[2]*b[2];
    c[8]+=0.281341f*(a[0]*b[8]+a[8]*b[0]);
    c[9]+=0.281264f*(a[0]*b[9]+a[9]*b[0]);
    c[15]+=0.281361f*(a[0]*b[15]+a[15]*b[0]);
    c[3]+=0.281660f*(a[0]*b[3]+a[3]*b[0]);
    c[14]+=0.281727f*(a[0]*b[14]+a[14]*b[0]);
    c[1]+=0.281767f*(a[0]*b[1]+a[1]*b[0]);
    c[10]+=0.281894f*(a[0]*b[10]+a[10]*b[0]);
    c[12]+=0.281884f*(a[0]*b[12]+a[12]*b[0]);
    c[4]+=0.281897f*(a[0]*b[4]+a[4]*b[0]);
    c[13]+=0.281956f*(a[0]*b[13]+a[13]*b[0]);
    c[6]+=0.281966f*(a[0]*b[6]+a[6]*b[0]);
    c[7]+=0.281987f*(a[0]*b[7]+a[7]*b[0]);
    c[5]+=0.282009f*(a[0]*b[5]+a[5]*b[0]);
    c[11]+=0.282026f*(a[0]*b[11]+a[11]*b[0]);
    c[2]+=0.282066f*(a[0]*b[2]+a[2]*b[0]);
  }

}
#endif